package com.example.learningnote.advanced;

import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import com.example.learningnote.R;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;


// RecyclerView 属性：
//         - `android:layout_width` 和 `android:layout_height`：定义 RecyclerView 的大小，通常设为 `match_parent`。
//         - `android:id`：用于在代码中查找 RecyclerView。
//  LayoutManager
//     LinearLayoutManager(Context context, int orientation, boolean reverseLayout)
//         - `orientation`：`LinearLayoutManager.VERTICAL` 或 `HORIZONTAL`。
//         - `reverseLayout`：是否反转布局顺序。
//         - GridLayoutManager：网格布局。
//         - StaggeredGridLayoutManager：瀑布流布局。
//  Adapter 方法：
//         - `onCreateViewHolder(ViewGroup parent, int viewType)`：创建 ViewHolder，加载列表项布局。
//         - `onBindViewHolder(ViewHolder holder, int position)`：绑定数据到 ViewHolder。
//         - `getItemCount()`：返回列表项总数。
//  ViewHolder
//         - 继承 `RecyclerView.ViewHolder`，缓存视图引用，减少 `findViewById()` 调用。
//         - 构造函数接收 `itemView`，用于初始化控件。
//  ItemDecoration
//         - `getItemOffsets`：为列表项设置偏移量（分隔线空间）。
//         - `onDraw`：绘制分隔线或其他装饰。
//
//  点击事件
//         - 通过接口 `OnItemClickListener` 实现，绑定到 `itemView` 的 `setOnClickListener`。
/**
 * RecyclerViewActivity 展示一个带有下拉刷新和上拉加载更多的联系人列表
 * 功能：初始加载20条数据，上拉加载更多（总共40条），下拉刷新重置为20条新数据
 */
public class RecyclerViewActivity extends AppCompatActivity {
    private RecyclerView recyclerView; // RecyclerView 组件
    private ContactAdapter adapter; // RecyclerView 的适配器
    private List<Contact> contactList; // 联系人数据列表
    private SwipeRefreshLayout swipeRefreshLayout; // 下拉刷新组件
    private int page = 1; // 当前页码
    private boolean isLoading = false; // 是否正在加载数据
    private boolean hasMoreData = true; // 是否还有更多数据
    private static final int PAGE_SIZE = 20; // 每页数据量
    private static final int MAX_ITEMS = 40; // 最大数据量

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_view);

        // 初始化下拉刷新组件
        swipeRefreshLayout = findViewById(R.id.swipeRefreshLayout);
        swipeRefreshLayout.setColorSchemeResources(R.color.selected_tab_color); // 设置刷新动画颜色

        // 初始化联系人数据列表
        contactList = new ArrayList<>();

        // 初始化 RecyclerView
        recyclerView = findViewById(R.id.recyclerView);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        // 设置适配器
        adapter = new ContactAdapter(contactList);
        recyclerView.setAdapter(adapter);

        // 添加分隔线
        recyclerView.addItemDecoration(new DividerItemDecoration(
                getResources().getColor(android.R.color.darker_gray), 2));

        // 设置列表项点击监听
        adapter.setOnItemClickListener(contact ->
                Toast.makeText(RecyclerViewActivity.this,
                        "姓名: " + contact.getName() + ", 电话: " + contact.getPhone(),
                        Toast.LENGTH_SHORT).show());

        // 设置下拉刷新监听
        swipeRefreshLayout.setOnRefreshListener(() -> {
            if (!isLoading) {
                page = 1; // 重置页码
                hasMoreData = true; // 重置是否有更多数据
                adapter.setLoadState(ContactAdapter.LOADING); // 显示加载中Footer
                new FetchDataTask(this, true).execute(); // 执行刷新任务
            }
        });

        // 设置上拉加载更多监听
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
                int visibleItemCount = layoutManager.getChildCount(); // 可见项数量
                int totalItemCount = layoutManager.getItemCount(); // 总项数量
                int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition(); // 第一个可见项位置

                // 当滑动到底部且未加载且有更多数据时触发加载
                if (!isLoading && hasMoreData && (firstVisibleItemPosition + visibleItemCount >= totalItemCount - 2)) {
                    isLoading = true;
                    page++;
                    adapter.setLoadState(ContactAdapter.LOADING);
                    new FetchDataTask(RecyclerViewActivity.this, false).execute();
                }
            }
        });

        // 初始加载数据
        swipeRefreshLayout.setRefreshing(true); // 显示初始刷新动画
        new FetchDataTask(this, true).execute();
    }

    /**
     * 模拟网络请求的 AsyncTask，用于异步加载数据
     */
    private static class FetchDataTask extends AsyncTask<Void, Void, List<Contact>> {
        private final WeakReference<RecyclerViewActivity> activityRef; // 弱引用避免内存泄漏
        private final boolean isRefresh; // 是否为下拉刷新

        FetchDataTask(RecyclerViewActivity activity, boolean isRefresh) {
            this.activityRef = new WeakReference<>(activity);
            this.isRefresh = isRefresh;
        }

        @Override
        protected List<Contact> doInBackground(Void... voids) {
            try {
                // 模拟网络延迟
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            RecyclerViewActivity activity = activityRef.get();
            if (activity == null) return null;

            List<Contact> newData = new ArrayList<>();
            int page = activity.page;
            int startIndex = (page - 1) * PAGE_SIZE + 1; // 计算起始索引
            Random random = new Random(); // 用于生成随机数

            // 模拟数据：每页20条，总共40条
            if (startIndex <= MAX_ITEMS) {
                int itemsToAdd = Math.min(PAGE_SIZE, MAX_ITEMS - startIndex + 1); // 计算本页数据量
                for (int i = 0; i < itemsToAdd; i++) {
                    int randomNum = random.nextInt(100000); // 生成0-99999的随机数
                    newData.add(new Contact(
                            "联系人 " + (startIndex + i),
                            randomNum+ String.format("%02d", (startIndex + i))
                    ));
                }
            }
            return newData;
        }

        @Override
        protected void onPostExecute(List<Contact> newData) {
            RecyclerViewActivity activity = activityRef.get();
            if (activity == null) return;

            activity.isLoading = false; // 加载完成
            activity.swipeRefreshLayout.setRefreshing(false); // 停止刷新动画

            if (newData == null || newData.isEmpty()) {
                activity.hasMoreData = false; // 标记无更多数据
                activity.adapter.setLoadState(ContactAdapter.NO_MORE); // 显示无更多数据Footer
                if (!isRefresh) {
                    Toast.makeText(activity, "没有更多数据", Toast.LENGTH_SHORT).show();
                }
                return;
            }

            // 根据是否为刷新操作处理数据
            if (isRefresh) {
                activity.contactList.clear(); // 清除旧数据
            }
            activity.contactList.addAll(newData); // 添加新数据
            activity.adapter.notifyDataSetChanged(); // 通知适配器数据变更
            activity.adapter.setLoadState(ContactAdapter.LOADING_COMPLETE); // 隐藏加载Footer
        }
    }
}
